import junit.framework.Assert;
import junit.framework.*;


public class TestInfraestructuraLaberinto extends TestCase{
		public void testXMLtoObject(){
		Config.PATH_LABERINTO="data/tests/laberinto_prueba1.xml";
		BuilderLaberinto builderConcretoLaberinto=new BuilderLaberintoXML();
		Posicion[][] expected = new Posicion[3][3];
		
		ConfiguracionMatriz1(expected);
		ConfiguracionMatriz2(expected);
		
		builderConcretoLaberinto.buildMatrizLaberinto();
		Posicion[][] actual = builderConcretoLaberinto.getMatriz();
		

		
		Assert.assertTrue(sonIguales(actual,expected));

	}


	public void testObjectToXML(){
		Config.setConfig("data/tests/laberinto_prueba1.xml", "data/tests/personajes_prueba1.xml", "3" , "3","1", "data/tests/salidalabe_prueba.xml", "data/tests/salidapers_prueba.xml");
		Laberinto laberinto=new Laberinto();
		SerializadorLaberinto serializador=new SerializadorLaberinto(laberinto);
		serializador.serializar();
		
		Config.setConfig("data/tests/salidalabe_prueba.xml", "data/tests/personajes_prueba1.xml", "3","3","1", "data/tests/salidalabe_prueba2.xml", "data/tests/salidapers_prueba2.xml");
		
		BuilderLaberinto builderLaberinto=new BuilderLaberintoXML();
		
		builderLaberinto.buildMatrizLaberinto();
		Posicion[][] actual = builderLaberinto.getMatriz();
		
		Posicion[][] expected = new Posicion[3][3];
		
		ConfiguracionMatriz1(expected);
		ConfiguracionMatriz2(expected);

		Assert.assertTrue(sonIguales(expected,actual));
		
	}	
	
	
	private boolean sonIguales(Posicion[][] matriz1, Posicion[][] matriz2){
		boolean verdad=true;
		for (int i=0; i<3 ; i++){
			for (int j=0 ; j<3 ; j++){
				if (verdad==true)
					verdad = chequearIgualdadPosiciones(matriz1[i][j], matriz2[i][j]);
			}
		}
		return verdad;	
	}
	
	
	
	private boolean chequearIgualdadPosiciones(Posicion pos1, Posicion pos2){
		
		boolean igualdadpos= (pos1.getX()==pos2.getX() && pos1.getY()==pos2.getY());
		boolean igualdadcom= (pos1.queComidaTengo().equals(pos2.queComidaTengo()));
		boolean igualdadid= (pos1.getid().equals(pos2.getid()));
		boolean igualdadAdy=true;
		int i=0;
		while(i<4 && (igualdadAdy==true)){
			igualdadAdy= (pos1.getAdyacentes().get(i).getid().equals(pos2.getAdyacentes().get(i).getid()));
			i++;
		}		

		return (igualdadpos && igualdadcom && igualdadid && igualdadAdy);
	}
	
	
	
	
	static  void ConfiguracionMatriz1(Posicion[][] matriz) {
		
		matriz[0][0]= new Posicion("0000", 00, 00);
		matriz[0][0].setearComida(new Bolita());
		
		matriz[0][1]= new Posicion("0001", 00, 01);
		matriz[0][1].setearComida(new Ninguna());

		matriz[0][2]= new Posicion("0002", 00, 02);
		matriz[0][2].setearComida(new Bolon());
		
		matriz[1][0]= new Posicion("0100", 01, 00);
		matriz[1][0].setearComida(new Ninguna());
		
		matriz[1][1]= new Posicion("0101", 01, 01);
		matriz[1][1].setearComida(new Bolita());
		
		matriz[1][2]= new Posicion("0102", 01, 02);
		matriz[1][2].setearComida(new Bolita());
		
		matriz[2][0]= new Posicion("0200", 02, 00);
		matriz[2][0].setearComida(new Ninguna());
		
		matriz[2][1]= new Posicion("0201", 02, 01);
		matriz[2][1].setearComida(new Bolita());
		
		matriz[2][2]= new Posicion("0202", 02, 02);
		matriz[2][2].setearComida(new Bolita());
	}
	
	
	static void ConfiguracionMatriz2(Posicion[][] matriz){
		
		matriz[0][0].agregarAdjacente(Direccion.Derecha, matriz[0][1]);
		matriz[0][1].agregarAdjacente(Direccion.Izquierda, matriz[0][0]);
		matriz[0][2].agregarAdjacente(Direccion.Arriba, matriz[2][2]);
		matriz[1][0].agregarAdjacente(Direccion.Abajo, matriz[2][0]);
		matriz[1][1].agregarAdjacente(Direccion.Derecha, matriz[1][2]);
		matriz[1][2].agregarAdjacente(Direccion.Izquierda, matriz[1][1]);
		matriz[2][0].agregarAdjacente(Direccion.Arriba, matriz[1][0]);
		matriz[2][1].agregarAdjacente(Direccion.Abajo, matriz[0][1]);
		matriz[2][2].agregarAdjacente(Direccion.Derecha, matriz[2][0]);
		
	}

}
